/*
 * Copyright (c)  2020,  DataPipeline
 * All rights reserved.
 *
 * Id:Dialect.java   2020-07-11 01:40 wanglijun
 */
package cn.datacare.orm.dialect;


import cn.datacare.orm.annotation.id.IdType;
import cn.datacare.orm.constant.SqlSourceType;
import cn.datacare.orm.conversion.NameConversion;
import cn.datacare.orm.engine.Beetl;
import cn.datacare.orm.handler.KeyWordHandler;
import cn.datacare.orm.manager.impl.MetaDataManager;
import cn.datacare.orm.source.SQLSource;

import java.util.Set;

/**
 * <p>
 * Title: 数据库方言接口
 * </p>
 * <p>
 * Description: 数据库方言接口
 * </p>
 * <p>
 * Copyright: Copyright (c) 2020
 * </p>
 * <p>
 * Company/Department: DataPipeline
 * </p>
 *
 * @author wanglijun
 * @version 1.0
 * @since 2020-07-11 01:40
 */
public interface Dialect extends PageDialect {
    /**
     * 初始 Beetle引擎
     *
     * @param beetl BeetlEngine
     */
    void init(Beetl beetl);

    /***
     * 获取数据库名称
     * @return String 数据库名称
     */
    String getName();

    /**
     * 获取 KeyWordHandler
     * @return KeyWordHandler
     */
    KeyWordHandler getKeyWordHandler();

    /**
     * 设置KeyWordHandler
     * @param keyWordHandler
     */
    void setKeyWordHandler(KeyWordHandler keyWordHandler);

    /**
     * 获取数据
     *
     * @return Integer
     */
    Integer getType();

    /**
     * 设置命名转换器
     *
     * @param nc NameConversion
     */
    void setNameConversion(NameConversion nc);

    /**
     * 获取 MetaDataManager
     *
     * @return MetaDataManager MetaDataManager
     */
    MetaDataManager getMetaDataManager();

    /**
     * 设置 MetaDataManager
     *
     * @param metaDataManager MetaDataManager
     */
    void setMetaDataManager(MetaDataManager metaDataManager);

    /**
     * 获取SequenceValue
     * @param sequenceName
     * @return String 序列名称
     */
    String getSequenceValue(String sequenceName);

    /**
     *
     * @param clazz
     * @return SQLSource
     */
    SQLSource genSelectById(Class<?> clazz);

    /**
     *
     * @param clazz
     * @return
     */
    SQLSource genExistSql(Class<?> clazz);

    /**
     *
     * @param clazz
     * @return
     */
    SQLSource genSelectByIdForUpdate(Class<?> clazz);

    /**
     *
     * @param clazz
     * @return
     */
    SQLSource genSelectByTemplate(Class<?> clazz);

    /**
     *
     * @param clazz
     * @return
     */
    SQLSource genSelectCountByTemplate(Class<?> clazz);

    /**
     *
     * @param clazz
     * @return
     */
    SQLSource genDeleteById(Class<?> clazz);

    /**
     *
     * @param clazz
     * @return
     */
    SQLSource genSelectAll(Class<?> clazz);

    /**
     *
     * @param clazz
     * @return
     */
    SQLSource genUpdateAll(Class<?> clazz);

    /**
     *
     * @param clazz
     * @return
     */
    SQLSource genUpdateById(Class<?> clazz);

    /**
     *
     * @param clazz
     * @return
     */
    SQLSource genUpdateAbsolute(Class<?> clazz);

    /***
     *
     * @param clazz
     * @return SQLSource
     */
    SQLSource genUpdateTemplate(Class<?> clazz);

    /**
     * @param clazz
     * @return SQLSource
     */
    SQLSource genInsert(Class<?> clazz);

    /***
     *
     * @param tableName
     * @return String
     */
    String genColAssignProperty(String tableName);

    /**
     * 插入模板
     *
     * @param clazz
     * @return SQLSource
     */
    SQLSource genInsertTemplate(Class<?> clazz);


    /**
     * 获取ID类型
     *
     * @param clazz      Clazz
     * @param idProperty
     * @return
     */
    IdType getIdType(Class<?> clazz, String idProperty);

    /**
     * 获取列表
     *
     * @param tableName TableName
     * @return Set<String>
     */
    Set<String> getCols(String tableName);

    /**
     * 生成条件
     *
     * @param tableName
     * @return String
     */
    String genCondition(String tableName);

    String genColAssignPropertyAbsolute(String tableName);

    String genColumnList(String table);

    /***
     * 获取SQLSource
     * @param sqlSourceType SqlSourceType
     * @param  clazz Class
     * @return SQLSource SQLSource
     */
    SQLSource getSqlSource(SqlSourceType sqlSourceType,Class<?> clazz);
}
